package org.apli.haiam.admin.jsf.managed;

import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.apli.haiam.admin.entidades.UsuarioAdmin;
import org.apli.haiam.ejb.entidades.AdmMedico;
import org.apli.haiam.ejb.entidades.AdmPermiso;
import org.apli.jsf.managed.JsfBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Clase backing Bean que administra la entidad AdmLicencia.
 * <p>
 * <H6>Soporte:HAIAM
 * <I>david_s_1086@hotmail.com,david.carranza@haiam.gob.ec</I></H6>
 *
 * @author david Carranza
 * @version 1.0 30/07/2014
 */
@ManagedBean
@ViewScoped
public class JsfLicencia extends JsfBean<AdmPermiso> {

    final Logger log = LoggerFactory.getLogger(JsfLicencia.class);
    private Integer tipoPermiso;
    private Date fechaInicio;
    private Date fechaFin;

    /**
     * Constructor por defecto.
     */
    public JsfLicencia() {
    }

    /**
     * Inicializa los datos miembros.
     */
    @Override
    protected void inicializar() {
        //setSwGrabar(false);
        object = new AdmPermiso();
        tipoPermiso = 1;
        fechaFin = null;
        fechaInicio = null;

    }

    /**
     * Graba el registro asociado al objeto que se administra en la página.
     *
     * @return null, se mantiene en la página invocada.
     */
    @Override
    public String grabarAction() {
        FacesContext context = FacesContext.getCurrentInstance();
        //Saca el dia actual de la fecha actual
        boolean act = true;
        try {
            Date c11 = object.getApeFechaInicio();
            Calendar c1 = Calendar.getInstance();
            c1.setTime(c11);
            Integer anioInicio = c1.get(Calendar.YEAR);
            object.setApeAnioInicio(anioInicio);
            Date c12 = object.getApeFechaFin();
            Calendar c2 = Calendar.getInstance();
            c2.setTime(c12);
            Integer anioFin = c2.get(Calendar.YEAR);
            object.setApeAnioFin(anioFin);
        } catch (Exception e) {
            log.error("sacar anio de licencia() {} ", e.getMessage());
        }
        object.setApeMotivo(object.getApeMotivo().toUpperCase());
        if (tipoPermiso == 1) {

            if (lista.size() > 0 || !lista.isEmpty()) {
                if (object.getApeId() == null) {
                    if (object.getApeFechaInicio().before(object.getApeFechaFin()) || object.getApeFechaInicio().equals(object.getApeFechaFin())) {
                        for (AdmPermiso cexLicencia : lista) {
                            try {
                                if ((object.getApeFechaInicio().before(cexLicencia.getApeFechaInicio()) && object.getApeFechaFin().before(cexLicencia.getApeFechaInicio())) || (object.getApeFechaInicio().after(cexLicencia.getApeFechaFin()))) {
                                    object.setApeTipo(0);
                                    admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                    inicializar();
                                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                                } else {
                                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fecha incorrecta!!", "Rango de fecha ya se encuentran asignadas a Médico"));
                                    return null;
                                }
                            } catch (Exception e) {
                                log.error("grabarAction() {} ", e.getMessage());
                                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                            }

                        }
                    } else {
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fecha incorrecta!!", "Fecha inicio debe ser mayor o igual a la fecha fin"));
                    }
                } else {
                    try {
                        for (AdmPermiso cexLicencia : lista) {
                            if (!cexLicencia.getApeId().equals(object.getApeId())) {
                                if ((object.getApeFechaInicio().before(cexLicencia.getApeFechaInicio()) && object.getApeFechaFin().before(cexLicencia.getApeFechaInicio())) || (object.getApeFechaInicio().after(cexLicencia.getApeFechaFin()))) {
                                    object.setApeTipo(0);
                                    admin.modificar(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.actualizar")));
                                    return null;
                                } else {
                                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fecha incorrecta !!", "Rango de fecha ya se encuentran asignadas a Médico"));
                                    return null;
                                }
                            }

                        }

                    } catch (Exception e) {
                        log.error("grabarAction() {} ", e.getMessage());
                        FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                    }
                }
            } else {
                try {
                    if (lista.isEmpty()) {
                        if (object.getApeFechaInicio().before(object.getApeFechaFin()) || object.getApeFechaInicio().equals(object.getApeFechaFin())) {
                            admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                            inicializar();
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                        } else {
                            FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fecha incorrecta!!", "Fecha inicio debe ser mayor o igual a la fecha fin"));
                        }

                    }
                } catch (Exception e) {
                    log.error("grabarAction() {} ", e.getMessage());
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
                }
            }
        } else {
            try {
                List<AdmMedico> listaMedico = adminObject.listar(AdmMedico.class, "ameEstado", 1);
                if (object.getApeFechaInicio().before(object.getApeFechaFin()) || object.getApeFechaInicio().equals(object.getApeFechaFin())) {
                    for (Iterator<AdmMedico> it = listaMedico.iterator(); it.hasNext();) {
                        AdmMedico objCexMed = it.next();
                        object.setAdmMedico(objCexMed);
                        admin.crear(object, (UsuarioAdmin) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("user"));
                        object.setAdmMedico(null);
                    }
                } else {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fecha incorrecta!!", "Fecha inicio debe ser mayor o igual a la fecha fin"));
                    act = false;
                }
                if (act) {
                    FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(bundle.getString("msg.grabar")));
                    inicializar();
                }

            } catch (Exception e) {
                log.error("grabarAction() {} ", e.getMessage());
                FacesContext.getCurrentInstance().addMessage(findComponent(context.getViewRoot(), "formDatos").getClientId(), new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
            }
        }
        cargarLista();
        return null;
    }

    /**
     * Graba un permiso por grupo de atencion.
     *
     * @return null, se mantiene en la página invocada.
     */
    public String grabarPermisoGrupo() {
        FacesContext context = FacesContext.getCurrentInstance();
        //Saca el dia actual de la fecha actual
        try {
            Date c11 = fechaInicio;
            Calendar c1 = Calendar.getInstance();
            c1.setTime(c11);
            Integer anioInicio = c1.get(Calendar.YEAR);
            object.setApeAnioInicio(anioInicio);
            Date c12 = fechaFin;
            Calendar c2 = Calendar.getInstance();
            c2.setTime(c12);
            Integer anioFin = c2.get(Calendar.YEAR);
            object.setApeAnioFin(anioFin);

        } catch (Exception e) {
            log.error("grabarPermisoGrupo() {} ", e.getMessage());
        }

        return null;
    }

//   public void setEstado(boolean estado) {
//        if (object != null) {
//            object.set(estado ?  1 :  0);
//        }
//    }
//
//    public boolean isEstado() {
//        if (object != null && object.getEstado() != null) {
//            return object.getEstado() == 1 ? true : false;
//        }
//        return false;
//    }
    /**
     * Carga la lista de objetos en una lista de la página.
     */
    @Override
    public void cargarLista() {
        String nombreMetodo = Thread.currentThread().getStackTrace()[1].getMethodName() + "()";
        if (admin == null) {
            lista = null;
            return;
        }
        try {
            lista = admin.listarOrdenada(object.getClass(), "admMedico", object.getAdmMedico(), "apeFechaInicio", true);
        } catch (Exception e) {
            log.error("{}: {} ", nombreMetodo, e);
        }
    }

    public Integer getTipoPermiso() {
        return tipoPermiso;
    }

    public void setTipoPermiso(Integer tipoPermiso) {
        this.tipoPermiso = tipoPermiso;
    }

    public Date getFechaInicio() {
        return fechaInicio;
    }

    public void setFechaInicio(Date fechaInicio) {
        this.fechaInicio = fechaInicio;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    @Override
    protected ResourceBundle getProperties() {
        return ResourceBundle.getBundle("aplicacion");
    }

    @Override
    public List<SelectItem> getSelectedItem() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
